package com.yequan.leetcode.linkedlist.swappairs_24;

import com.yequan.leetcode.linkedlist.ListNode;

/**
 * //给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 * //
 * // 你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 * //
 * //
 * //
 * // 示例:
 * //
 * // 给定 1->2->3->4, 你应该返回 2->1->4->3.
 * //
 * // Related Topics 链表
 *
 * @author : Administrator
 * @date : 2020/3/16
 */
public class SwapPairs {

    /**
     * 迭代法
     *
     * @param head
     * @return
     */
    public ListNode swapPairs1(ListNode head) {
        if (null == head || head.next == null) {
            return head;
        }
        ListNode preHead = new ListNode(-1);
        preHead.next = head;
        ListNode tempNode = preHead;
        while (tempNode.next != null && tempNode.next.next != null) {
            ListNode node1 = tempNode.next;
            ListNode node2 = tempNode.next.next;
            tempNode.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            tempNode = node1;
        }
        return preHead.next;
    }

    /**
     * 递归法
     *
     * @param head
     * @return
     */
    public ListNode swapPairs2(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = head.next;
        head.next = swapPairs2(newHead.next);
        newHead.next = head;
        return newHead;
    }


}
